package actions.movimientos;

import java.util.Date;
import java.util.List;

import services.movimiento.MovimientoStockService;
import util.GSonHelper;
import util.SearchOperator;
import actions.base.BaseAction;

import com.google.gson.Gson;

import dto.MovimientoStockDTO;
import dto.SearchDTO;
import exceptions.CannotDeleteException;
import exceptions.CannotSaveException;

public class MovimientosStockAction extends BaseAction {
	
	private static final long serialVersionUID = 1L;

	private MovimientoStockService movimientoStockService;
	
	private MovimientoStockDTO movimientoStockDTO;
	
	private String query;
	
	private Date fechaInicio;
	
	private Date fechaFin;
	
	
	@Override
	public String execute() {
		return SUCCESS;
	}
	
	/**
	 * Agrega un nuevo movimientoStock
	 * @return
	 */
	public String agregar() {
		
		// TODO hacer validaciones
		
		try {
			movimientoStockService.save(movimientoStockDTO);
		} catch (CannotSaveException e) {
			setOk("false");
			setMensaje("No se ha podido almacenar el movimientoStock");
			return SUCCESS_AGREGAR;
		}
		setOk("true");
		setMensaje("El movimientoStock se ha almacenado correctamente");
		return SUCCESS_AGREGAR;
	}
	
	/**
	 * Borra un movimientoStock
	 * @return
	 */
	public String borrar() {
		
		// TODO hacer validacion sobre ID
		
		try {
			movimientoStockService.delete(id);
		} catch (CannotDeleteException e) {
			setOk("false");
			setMensaje("El movimientoStock no se ha podido eliminar");
			return SUCCESS_AGREGAR;
		}
		setOk("true");
		setMensaje("El movimientoStock se ha eliminado correctamente");
		return SUCCESS_AGREGAR;
	}

	/**
	 * Obtiene una lista de todos los movimientoStocks
	 * @return	la lista
	 */
	public String getMovimientoStocks() {

		List<MovimientoStockDTO> movimientoStocks = movimientoStockService.findAll("id", false);
		
		Gson gson = GSonHelper.getInstance();
		String movimientoStocksStr = gson.toJson(movimientoStocks);
		
		setLista(movimientoStocksStr);
		return SUCCESS_LISTADO;
	}
	
	/**
	 * Obtiene un movimientoStock
	 * @return el movimientoStock
	 */
	public String getMovimientoStock() {
		
		// TODO validacion sobre ID
		
		MovimientoStockDTO movimientoStock = movimientoStockService.findById(id);
		
		Gson gson = GSonHelper.getInstance();
		String movimientoStockStr = gson.toJson(movimientoStock);
		setLista(movimientoStockStr);
		return SUCCESS_JSON;
	}
	
	/**
	 * Obtiene una lista de movimientoStocks para mostrar en un listado 'typeahead'
	 * @return	la lista json
	 */
	public String getMovimientoStockList() {
		
		SearchDTO searchDTO = new SearchDTO();
		searchDTO.addCriteria("descripcion", getQuery(), SearchOperator.LIKE);
		
		List<MovimientoStockDTO> movimientoStocks = movimientoStockService.search(searchDTO);
		
		Gson gson = GSonHelper.getInstance();
		String movimientoStocksStr = gson.toJson(movimientoStocks);
		
		setLista(movimientoStocksStr);
		return SUCCESS_LISTADO;
	}

	
	/**
	 * Busca movimientoStocks
	 */
	public String buscar() {
		
		// TODO validacion sobre DTO
		
		SearchDTO searchDTO = new SearchDTO();
		searchDTO.addBeetwenCriteria("fecha", fechaInicio, fechaFin);
		
		List<MovimientoStockDTO> movimientoStocks = movimientoStockService.search(searchDTO);
		
		Gson gson = GSonHelper.getInstance();
		String movimientoStocksStr = gson.toJson(movimientoStocks);
		
		setLista(movimientoStocksStr);
		return SUCCESS_LISTADO;
	}
	
	
	/**
	 * Getters & Setters
	 */
	public MovimientoStockDTO getMovimientoStockDTO() {
		return movimientoStockDTO;
	}

	public String getQuery() {
		return query;
	}

	public void setQuery(String query) {
		this.query = query;
	}

	public void setMovimientoStockDTO(MovimientoStockDTO movimientoStockDTO) {
		this.movimientoStockDTO = movimientoStockDTO;
	}

	public MovimientoStockService getMovimientoStockService() {
		return movimientoStockService;
	}

	public void setMovimientoStockService(MovimientoStockService movimientoStockService) {
		this.movimientoStockService = movimientoStockService;
	}

	public Date getFechaInicio() {
		return fechaInicio;
	}

	public void setFechaInicio(Date fechaInicio) {
		this.fechaInicio = fechaInicio;
	}

	public Date getFechaFin() {
		return fechaFin;
	}

	public void setFechaFin(Date fechaFin) {
		this.fechaFin = fechaFin;
	}

}
